% Вторая глава работы 
\chapter{Distributed Network Address Translation}
\label{chap2}

\section{Архитектура}
\label{chap2:sec1}
Положим, что каждый хост имеет свой внутренний IP--адрес, который должен быть транслирован во внешний. При реализации механизма DNAT, стеки протокола TCP/IP запрограммированы на хостах таким образом, что их IP--уровни используют локальные адреса для связи внутри подсети. В то же время пакеты, направленные на удаленные хосты, проходят через DNAT--маршрутизатор. 

Таким образом, каждый из внутренних хостов имеет 2 IP--адреса: локальный адрес и адрес подсети. Последний как раз и является внешним адресом DNAT--маршрутизатора. Для того, чтобы маршрутизатору не приходилось транслировать все порты, хосты настраивают на использование некоторого количества внутренне локальных портов для всех внешних запросов.

\section{Протокол Распределения Портов}
\label{chap2:sec2}
Чтобы избежать конфликтов портов, используется Протокол Распределения Портов (Port Distribution Protocol, PDP). Суть его состоит в генерации случайных номеров портов для каждого из внутренних хостов. Протокол  состоит из трех частей:
\begin{itemize}
\item PDP--запрос
\item PDP--ответ
\item PDP--аннуляция
\end{itemize}

PDP--запрос посылается от хоста к маршрутизатору для получения блока портов. К IP--заголовку прибавляется следующее:
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{PDP-rec}}
 \caption{PDP--запрос}
\label{fig1}
\end{figure}

Поля соответствуют ICMP (Internet Control Message Protocol) и имеют следующие характеристики:
\begin{itemize}
\item Тип (Type) --- 1 байт
\item Код (Code) --- 1 байт: 0 для портов свыше 10000, 128 для портов ниже 10000.
\item Контрольная сумма (Checksum) --- 2 байта: шестнадцатибитное дополнение до единицы суммы дополнения до единицы всего запроса. В целях облегчения подсчета контрольной суммы изначально ее поле равно 0.
\item Запрашиваемые порты (Ports requested) --- 1 байт: количество портов, запрашиваемых хостом. Предполагаемыми значениями являются либо 16, либо 32, что является достаточным для нужд большинства хостов.
\item Неиспользуемое (Unused) --- 3 байта: 0.
\end{itemize}

Хост отправляет PDP--запрос сразу после загрузки. Положительный или отрицательный PDP--ответ посылается от маршрутизатора к хосту. Дополнение к IP--заголовку имеет следующий формат:
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{PDPresponse}}
 \caption{PDP--ответ}
\label{fig1}
\end{figure}
Поля определены как:
\begin{itemize}
\item Тип (Type) --- 1 байт
\item Код (Code) --- 1 байт: 0 для портов свыше 10000, 128 для портов ниже 10000.
\item Контрольная сумма (Checksum) --- 2 байта: шестнадцатибитное дополнение до единицы суммы дополнения до единицы всего запроса. В целях облегчения подсчета контрольной суммы изначально ее поле равно 0.
\item Нижний порт (Lowest port) --- 2 байта: Номер нижнего порта в блоке.
\item Количество портов (Total ports) --- 1 байт: Общее количество портов, выделенных хосту.
\item Неиспользуемое (Unused) --- 3 байта: 0.
\end{itemize}

При получении положительного PDP--ответа хост заносит в память информацию о выделенном ему блоке портов. В процессе обмена пакетами он помечает их как используемые или свободные. При получении отрицательного PDP--ответа хост может послать другой запрос на меньшее количество портов. Если маршрутизатор не может выделить запрашиваемый блок смежных портов для хоста, он может ответить с положительным статусом, но выделить меньше портов, чем запрашивалось.
Маршрутизатор хранит у себя таблицу соответствий портов внешним IP--адресам в PTIP--таблице (Port-To-IP Table). Пример записи из PTIP--таблицы приведен ниже. Для одного и того же IP--адреса может быть существовать несколько записей.
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{PDPinvalidate}}
 \caption{PTIP--таблица}
\label{fig2}
\end{figure}

PDP--аннуляция используется для освобождения портов, которые на данный момент привязаны к одному из хостов. Дополнение к IP--заголовку имеет следующий формат:

\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{FilePTIP}}
 \caption{PDP--аннуляция}
\label{fig3}
\end{figure}

Поля определяются следующим образом:
\begin{itemize}
\item Тип(Type) --- 1 байт:32.
\item Код(Code) --- 1 байт: 2.
\item Контрольная сумма (Checksum) --- 2 байта: шестнадцатибитное дополнение до единицы суммы дополнения до единицы всего запроса. В целях облегчения подсчета контрольной суммы изначально ее поле равно 0.
\item Порт(Port) --- 1 байт: Номер порта, используемого хостом.
\item Неиспользуемое (Unused) --- 3 байта: 0.
\end{itemize}

Возможно, что двум разным хостам были выделены перекрывающиеся блоки портов номеров (например, в результате сбоя или перезагрузки маршрутизатора). При получении пакета, направленного во внешнюю сеть, маршрутизатор должен проверить PTIP--таблицу на предмет нахождения порта хоста внутри блока выделенных ему портов. Если порт с этим номером не привязан к хосту, маршрутизатор не сможет в дальнейшем идентифицировать ответный пакет. Он отклоняет исходный и посылает PDP--аннуляцию хосту. При получении PDP--аннуляции, хост должен прекратить использование всех выделенных портов и запросить новый блок. PDP--аннуляция также может использоваться для предотвращения простоя портов: с помощью подобного сообщения можно заставить хост освободить несколько или даже все порты, которые были для него зарезервированы. Маршрутизатору следует посылать PDP--аннуляцию любому хосту, который не связывался со внешней сетью более чем 10 минут. При перезагрузке маршрутизатор должен аннулировать все розданные порты при помощи отсылки PDP--аннуляции каждому хоcту. Когда порт или множество портов аннулируются, все текущие транзакции между хостом и внешними серверами будут прерваны. DNAT--маршрутизатор должен попытаться на время «затемнить» недавно аннулированные порты, чтобы внешние сервера имели возможность ответить на уже посланные им пакеты.

\section{Диаграммы взаимодействия}
\label{chap2:sec3}
В данной секции проиллюстрировано с помощью блок--схем взаимодействие между локальным хостом и DNAT--маршрутизатором. Когда хост связывается с внешним сервером, он посылает туннеллированные IP--пакеты в локальную подсеть. Заголовок внутреннего IP--пакета содержит IP--адрес внутреннего хоста в поле источника и IP--адрес маршрутизатора в поле получателя. Заголовок внешнего IP--пакета содержит внешний IP--адрес подсети в поле источника и IP--адрес внешнего сервера в поле получателя. Порт источника должен быть уникальным внутри локальной сети. Если у хоста нет свободного порта, ему необходимо запросить новый блок портов с помощью PDP--запроса. Когда хост передает данные другому локальному хосту, тогда ни туннелей, ни локально--уникального порта не требуется.

%Рисунок DNAT host transmission process. 
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATHostTransmissionProcess}}
 \caption{Процесс передачи DNAT--хоста}
\label{fig3}
\end{figure}


Остается вопрос: как локальный хост определяет локальность передачи. Поскольку за DNAT--маршрутизатором может находиться не одна подсеть, проверка масок локальных подсетей не сработает. Для решения этой проблемы можно воспользоваться следующим способом: ввести вручную в конфигурацию DNAT--маршрутизатора все маски подсетей, с которыми он работает. В таком случае, хост может использовать проверку маски подсети, а если результат этой проверки отрицателен, то опрашивать маршрутизатор на предмет локальности адреса.

\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATRouterOperationsOnOutgoingPackets}}
 \caption{Операции DNAT--маршрутизатора над исходящими пакетами}
\label{fig3}
\end{figure}

Когда туннельный пакет, отправленный локальным хостом, достигает DNAT--маршрутизатора, тот должен проверить по своей PTIP--таблице, что порт находится внутри блока выделенных для источника портов. Если это не так, маршрутизатор отсылает PDP--аннуляцию и отклоняет пакет.


%Рисунок DNAT router operations on incoming packets. 

\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATRouterOperationsOnIncomingPackets}}
 \caption{Операции DNAT--маршрутизатора над входящими пакетами}
\label{fig3}
\end{figure}
Когда DNAT--маршрутизатор получает пакет от внешнего хоста по некоторому порту, маршрутизатор первым делом удостоверивается, что этот порт зарегистрирован в PTIP--таблице. Если его там не оказывается, пакет удаляется, а внешнему серверу отправлется сообщение об ошибке. В случае успешной проверки DNAT -- маршрутизатор определяет IP--адрес внутреннего хоста по PTIP--таблице.
Когда DNAT--хост получает пакет, первым делом он определяет тип источника: внутренний или внешний. Для этого он проверяет поле следующего протокола внешнего IP--заголовка. Если источник локальный, то используется процедура нормального получения пакета. В противном случае, внешний IP--заголовок отбрасывается и только после этого пакет принимается обычным образом.

%Рисунок DNAT host reception process. 
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATHostReceptionProcess}}
 \caption{Процесс получения пакетов DNAT--хостом}
\label{fig3}
\end{figure}
\cite{lit3}

%%% Local Variables:
%%% mode: latex
%%% coding: utf-8-unix
%%% TeX-master: "../default"
%%% End:
